// UserManager.h

/*
主要提供UserManager类,用于管理用户账号id,pwd.处理用户登录,登出,创建用户等操作.
维护一个online_users的map,用于存储当前在线用户的信息,包括id,sockfd等.

UserManager类主要包含以下成员变量:
1. user_count: 用户计数器,用于生成用户id
2. online_users: 当前在线用户信息,包括id,sockfd等
===================================================
UserManager类主要包含以下功能:
1. 用户登录,登出,创建用户
2. 用户信息存储,读取,更新

*/



#ifndef USERMANAGER_H
#define USERMANAGER_H


#include "MySocket.h"
#include <fstream>
#include <filesystem> // 使用experimental::filesystem
#include <unordered_map>
#include "User.h"
#include "ChatList.h"

namespace fs = std::filesystem; // 修改命名空间别名


class UserManager {
    
    private:
    // 文件配置常量
    static constexpr const char* USER_FILE_DIR = "data/users/";
    static constexpr const char* COUNTER_FILE = "data/user_counter.txt";
    static constexpr int USERS_PER_FILE = 1000;

    // 用户信息映射表
    mutable unordered_map<int, User> user_info;

    // 用户聊天列表映射表
    mutable unordered_map<int,ChatList> user_chat_list_info;

    //记录socketfd与用户id的映射
    mutable unordered_map<int, int> online_users;
    
    
    mutable int user_count;
    
    void save_counter_file();
    
public:
    UserManager();
    ~UserManager();

    
    
    int createUser(const string&name,const string& password)noexcept; // 创建一个用户

    int add_chat_list(const int& user_id, const string& chat_id);//添加用户的聊天列表,存储形式与用户信息相同
    int get_chat_list(const int& user_id, json& chat_list_json);//获取用户的聊天列表

    int login(const int& id, const string& password,socketfd sockfd) noexcept;//登录成功后，将用户信息加入到online_users中;从文件中读取信息并判断密码是否正确;
    int logout(const int& id) noexcept;//退出登录时，将用户信息从online_users中移除


    enum UserErr {fail=-1,success=0,non_exist=1,wrong_pwd=2,file_err=3};

    mutable unordered_map<int,json> user_info_pwd;

    /*存储格式为json["LIST"][id]/[state]为聊天id/状态*/ 
    mutable unordered_map<int,json> user_chat_list;


    int add_online_user(const int&id,const socketfd &sockfd) noexcept;//将用户信息加入到online_users中
    int remove_online_user(const int&id) noexcept;//将用户信息从online_users中移除
    bool is_online(const int&id)const noexcept;//判断用户是否在线


    // 文件路径处理
    string get_user_pwd_dir(const int& id) const;//获得用户密码and姓名的文件夹路径
    string get_user_file_path(const int& id) const;//获得用户密码and姓名的json文件路径
    string get_user_chat_list_path(const int& id) const;//获得用户聊天列表json文件路径
    string get_user_chat_list_dir(const int& id) const;//获得用户聊天列表文件夹路径
    
    int open_file(const string& file_path, ifstream& ifs) const;//打开文件
    int open_file(const string& file_path, ofstream& ofs) const;//打开文件

    // 用户操作

    int load_user_info(const int& id,json& user_json);//从json文件中读取用户信息,如果文件不存在,返回空json,不会抛出异常
    int load_user_info(const int& id) ;
    int quick_load_user_info(const int& id,User&user);//从json文件中读取用户信息,如果文件不存在,返回空json,不会抛出异常
    int quick_load_user_info(const int& id) ;
    int save_user_info(const int& id, const json& user_json) ;//创建用户后，将用户信息保存到json文件中


    int load_user_chat_list(const int& id,json& chat_list_json); //从json文件中读取用户角色列表,如果文件不存在,返回空json,不会抛出异常
    int load_user_chat_list(const int& id);
    int quick_load_user_chat_list(const int&id);
    int quick_load_user_chat_list(const int& id,ChatList&chat_list) ;//从json文件中读取用户角色列表,如果文件不存在,返回空json,不会抛出异常
    int save_user_chat_list(const int& id, const json& chat_list);//创建用户后，将用户角色列表保存到json文件中


    int get_sockfd(const int& id)const noexcept;//根据用户id获取sockfd

    void create_user_file(const int& id)const ;//创建用户文件

    int get_user_count()const noexcept;//获取用户计数器

    string get_user_name(const int& id) noexcept;//根据用户id获取用户名

};
#endif
